package com.jml.util;

import com.jml.client.protocol.RpcProtocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

public class PkgDecoder extends ByteToMessageDecoder {
    private Logger logger = LoggerFactory.getLogger(PkgDecoder.class);

    public PkgDecoder() {
    }

    /**
     * 解码器
     *
     * @param ctx
     * @param buffer
     * @param out
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
        //buffer.readableBytes()：所有的字节长度
        if (buffer.readableBytes() < RpcProtocol.HEAD_LEN) {
            //未读完足够的字节流，缓存后继续读
            return;
        }
        byte[] intBuf = new byte[4];
        //buffer.readerIndex()获取当前读取的位置，如果buffer还没有读取就是0，
        // 这里表示从第12个字节开始，往后读取数据到intBuf字节数组，一直到intBuf字节数组满了，
        // 这里获取的是bodyLen字段
        buffer.getBytes(buffer.readerIndex() + RpcProtocol.HEAD_LEN - 4, intBuf);    // ImHeader的bodyLen在第68位到71为, int类型
        int bodyLen = ByteConverter.bytesToIntBigEndian(intBuf);
        //根据bodyLen的长度来判断包是否完整
        if (buffer.readableBytes() < RpcProtocol.HEAD_LEN + bodyLen) {
            //未读完足够的字节流，缓存后继续读
            return;
        }
        byte[] bytesReady = new byte[RpcProtocol.HEAD_LEN + bodyLen];
        //读取全部的数据
        buffer.readBytes(bytesReady);
        out.add(bytesReady);
    }
}
